//
// Created by Administrator on 2022/10/27.
//

#include "stdio.h"
#include "string.h"
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 40
typedef int Status;
typedef char String[MAXSIZE+1];

//返回串S的元素个数,即串的长度
int StrLength(char* S){
    return S[0];
}
//生成一个值为字符串常量chars的串T
Status StrAssign(String T,char* P){
    if(strlen(P)>MAXSIZE){
        return ERROR;
    }
    T[0]= strlen(P);
    for (int i = 0; i < T[0]; ++i) {
        T[i+1] = *(P+i); //字符串常量的值是首字符的地址
    }
    return OK;
}

//朴素的模式匹配算法
//算法思想
//1.从主串的第一个字符开始匹配,如果子串的第一个字符和主串的能匹配,那么就继续匹配下一个,直至子串所有字符都匹配上
//2.如果不能匹配,则主串从下一个字符开始匹配,直到遍历完主串

Status Index(String s,int pos ,String t){
    if(!(pos>0&&pos<= StrLength(s)&& StrLength(t)<= StrLength(s))){
        return ERROR;
    }else{
        //遍历主串,最后几位长度小于t不用匹配
        for (int i = pos; i <= StrLength(s)-StrLength(t)+1 ; ++i) {
            //遍历子串
            for (int j = 1; j <= StrLength(t)  ; ++j) {
                //该子串第j个字符与主串第i个字符匹配上
                if(s[i+j-1]==t[j]){
                    //如果匹配上的是t的最后一个字符,说明该字串完全匹配上了,返回在主串s中的位置i
                    if(j==StrLength(t)) return i;
                    //如果匹配上的不是最后一个字符,则继续向后匹配
                    continue;
                }
                //如果未匹配上,则退出子串的这次循环,主串进入下一个字符开始匹配
                break;
            }
        }
        //如果主串匹配完了还是没有匹配上,说明没有能够匹配得上的子串,返回0
        return 0;
    }
}
//不使用for循环来解决
Status Index1(String s,int pos ,String t){
    if(!(pos>0&&pos<= StrLength(s)&& StrLength(t)<= StrLength(s))){
        return ERROR;
    }else{
        int m = s[0];
        int n = t[0];
        int i = pos,j=1;
        while(i<=m&&j<=n){
            if(s[i]==t[j]){ //如果匹配上了,二者都向后移动一位
                i++;
                j++;
            }else{ //如果没有匹配上,j等于1,i回到开始的最开始的下一个位置
                i = i-j+2;
                j = 1;
            }
        }
        if(j>n){ //匹配成功
            return i-n; //返回起始位置
        }else {
            return ERROR;
        }
    }
}
int main(){
    char* P = "googleoo1gledgoo1google";
    char* Q = "google";
    String p ,q,o;
    StrAssign(p,P);
    StrAssign(q,Q);
    int index = Index1(p,2,q);
    printf("%d",index);
    return 1;
}
